﻿/*
 * 由SharpDevelop创建。
 * 用户： Administrator
 * 日期: 2017/6/26
 * 时间: 23:52
 * 
 * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件
 */
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Collections.Generic;

namespace TIDTool
{
	/// <summary>
	/// TidFile类<br/>
	/// 对应tid文件的存储结构<br/>
	/// tid文件格式说明：<br/>
	/// <br/>
	/// <b>文件头（0x100字节）</b><br/>
	///   其中：<br/>
	///     0x7C开始的4字节是<b>起始文件号</b>（小端）<br/>
	///     0x84开始的4字节是<b>公共音频信息的偏移</b>（大端）<br/>
	/// <br/>
	/// <b>固定分隔符</b>（0x10字节，“1234567890123456”）<br/>
	/// <br/>
	/// <b>私有音频信息索引区</b>（变长）<br/>
	///   其中：<br/>
	///     0x00开始的4字节是<b>索引区音频文件个数</b>（小端）<br/>
	///     0x04开始的4字节是<b>音频文件的起始文件号</b>（小端）<br/>
	///     之后每7字节为一个音频文件索引，前4字节是固定值0x00000101（小端），后3字节是<b>私有音频信息的偏移</b>（大端）<br/>
	/// <br/>
	/// <b>私有音频数据区</b>（变长）<br/>
	///   由一个一个的音频文件的数据串联而成，中间不带任何分隔<br/>
	/// <br/>
	/// <b>私有音频信息区</b>（变长）<br/>
	///   每项为8字节，前4字节为<b>音频文件偏移</b>（大端），后4字节为<b>音频文件大小</b>（大端）<br/>
	/// <br/>
	/// <b>固定分隔符</b>（0x60000字节，每字节都是0xFF）<br/>
	/// <br/>
	/// <b>公共音频数据区</b>（变长）<br/>
	///   由一个一个的音频文件的数据串联而成，中间不带任何分隔<br/>
	/// <br/>
	/// <b>公共音频信息区</b>（变长）<br/>
	///   每项为8字节，前4字节为<b>音频文件偏移</b>（大端），后4字节为<b>音频文件大小</b>（大端）<br/>
	///   如果某项的偏移为0xFFFFFFFF，则该项无效<br/>
	/// </summary>
	[Serializable]
	public class TidFile
	{
		public const string HeaderText = "TopCrystal OID Data for V1.6 130K special";
		public const string FixStr = "1234567890123456";
		public const int FixNumber = 0x00000101;
		
		public string headerText;
		public int BeginNumber;
		public List<TidPosition> PrivateInfoIndex;
		public List<TidPosition> PublicInfoIndex;
//		public List<TidPosition> Positions;
		public Dictionary<TidPosition, byte[]> PrivateFileList;
		public Dictionary<TidPosition, byte[]> PublicFileList;
		
		public TidFile()
		{
			PrivateInfoIndex = new List<TidPosition>();
			PublicInfoIndex = new List<TidPosition>();
//			Positions = new List<TidPosition>();
			PrivateFileList = new Dictionary<TidPosition, byte[]>();
			PublicFileList = new Dictionary<TidPosition, byte[]>();
		}
		
		public static void TestSerialize()
	    {
	        TidFile c = new TidFile();
	        c.headerText = "asdfghjk";
	        FileStream fileStream = new FileStream("c:\\temp.dat", FileMode.Create);
	        BinaryFormatter b = new BinaryFormatter();
	        b.Serialize(fileStream, c);
	        fileStream.Close();
	    }
		
	    public static void TestDeSerialize()
	    {
	        TidFile c = new TidFile();
	        c.headerText = "kkkk";
	        FileStream fileStream = new FileStream("c:\\temp.dat", FileMode.Open, FileAccess.Read, FileShare.Read);
	        BinaryFormatter b = new BinaryFormatter();
	        c = b.Deserialize(fileStream) as TidFile;
	        Console.WriteLine("headerText: " + c.headerText);
//	        Console.WriteLine("BeginNumber: " + c.BeginNumber);
//	        Console.WriteLine("PositionsOffset: " + c.PositionsOffset);
	        fileStream.Close();
	    }
	}
}
